// bitmap 位向量
// set 设置基础列表(item 项唯一)
// checkBit 检查基础列表中，是否存在这个值
//

class Bitmap {
  constructor(bitsize = 10) {
    let byteSize = bitsize >> 3
    let remainder = bitsize & 0x07
    let boxSize = byteSize + (remainder ? 1 : 0)

    this.buf = Buffer.alloc(boxSize, 0)
  }

  bitSet(number) {
    let byteIndex = (number >> 3) - 1
    let remainder = number & 0x07

    // 存在余数的情况下
    if (remainder) {
      this.buf[byteIndex + 1] |= 1 << (8 - remainder)
    } else {
      // 不存在余数
      this.buf[byteIndex] |= 1 << 0
    }
  }

  checkBit(number) {
    let byteIndex = (number >> 3) - 1
    let remainder = number & 0x07

    // 存在余数的情况下
    if (remainder) {
      let isCurrent = !!(this.buf[byteIndex + 1] & (1 << (8 - remainder)))
      console.log(`${number} : ${isCurrent}`)
      return isCurrent
    } else {
      // 不存在余数
      let isCurrent = !!(this.buf[byteIndex] & (1 << 0))
      console.log(`${number} : ${isCurrent}`)
      return isCurrent
    }
  }
}
let bitMap = new Bitmap(8)
// set

// for (let i = 0; i < 10000000; i++) {
//   !(i % 3) && bitMap.bitSet(i)
// }
bitMap.bitSet(1)
bitMap.bitSet(4)
// bitMap.bitSet(2222)
// bitMap.bitSet(999988)

// check
bitMap.checkBit(1)
bitMap.checkBit(2)
bitMap.checkBit(3)
bitMap.checkBit(4)
// bitMap.checkBit(500)
// bitMap.checkBit(600)
// bitMap.checkBit(1000)
// bitMap.checkBit(2222)
// bitMap.checkBit(3588)
// bitMap.checkBit(9999)
// bitMap.checkBit(99998)
// bitMap.checkBit(999988)
// bitMap.checkBit(9999888)
// bitMap.checkBit(99998888)
// bitMap.checkBit(99999999)
console.log('-------')
console.log(bitMap)
console.log('length', bitMap.buf.length)
